W04 Qualitätssicherung
QS im Wintersemester 2024
Wir geben dieses Semester vor, dass sie folgenden Qualitätssicherungsmaßnahmen durchführen:
- Code Reviews
- Pair programming
- Tests
2024 wird nur begrenzt eine schriftliche Abgabe zur Qualitätssicherung notwendig sein. Stellen sie stattdessen sicher, dass ihre Teambegleitung Einsicht in ihren Qualitätssicherungsprozess hat.
Code Reviews
- Jeder Code muss von einem Teammitglied überprüft werden, das ihn nicht geschrieben hat.
- Verwendung von Checklisten zur Festlegung von Prüfkriterien.
- Festlegen, wann Reviews stattfinden (z.B. vor der Akzeptanz einer Anforderung).
- Aufmerksamkeit auf den Umgang mit Verbesserungsvorschlägen: Feedback konstruktiv geben und annehmen!
Static Code Analysis
Tools zur Codeanalyse können den Review Prozess deutlich vereinfachen!
- Meist durch Tools (Linter, teilweise als IDE-Plugins) automatisch ausgeführte Analyse des Quellcodes ohne Ausführung der Software
- Oft auf individuelle Bedürfnisse anpassbar
- Wahl des Tools abhängig von Ziel & Programmiersprache
- Je komplexer die Prüfung desto mehr muss mit False Positives umgegangen werden
- Überprüfung Coding Style
- Erkennen möglicher (einfacher) Fehler, Code Smells
- Best Practice Vorschläge
- Überprüfung auf Sicherheitslücken
- Überprüfung Coding Style
- Werden von der Autor*in des Codes ausgeführt und gefundene Fehler behoben
- Automatische Ausführung kann in den Entwicklungsprozess integriert werden (Continuous Integration) mit regelmäßiger Ausführung z.B. bei Commit
Tests
Um Ihr Projekt zu testen, sind in der Regel automatisierte Tests auf einer Continuous Integration-Plattform empfehlenswert. Die Möglichkeiten zur Umsetzung dieser Tests hängen jedoch von den spezifischen Anforderungen und Gegebenheiten Ihres Projekts ab.
Manuelle Tests
- Manuell von Entwickler*innen, die das Feature nicht entwickelt haben, durchgeführter Test
- Gutes Mittel um Aspekte der Software zu testen, die sich schwer automatisiert testen lassen (wie z.B. UI)
- Test-Protokolle werden erstellt und abgearbeitet
- Zeitpunkt zur Prüfung z.B. nach Fertigstellung eines Features
Automatische Tests
- Automatisch ausführbare Tests in verschiedenem Umfang (Unit Tests, Integrationstests, Systemtests)
- Ausreichende Anzahl Testfälle (sichergestellt z.B. durch Berechnung der Testabdeckung)
- Werden von der Autor*in des Codes entwickelt, ausgeführt und gefundene Fehler behoben
- Automatische Ausführung kann in den Entwicklungsprozess integriert werden (Continuous Integration) mit regelmäßiger Ausführung z.B. bei
Commit
Auflistung Ziel & Maßnahmen bis 2023
Die folgenden Beschreibungen möglicher Qualitätssicherungs-Ziele und Maßnahmen wurde vom Bachelor-Praktikum Team 2020-2023 zusammengetragen und beruht auf Definitionen aus ISO 25010, Vorlesungsmaterial der Software-Engineering-Vorlesung zu Softwarequalität 2017 von Richard Bubel und Dominic Steinhöfel und dem Material des Bachelor-Praktikums SoSe19 von Richard Bubel und Dr. Michael Eichberg.
Diese Auflistung ist insbesondere als Hilfestellung gedacht, falls ihre Auftraggeber:in zusätzlich Anforderungen an die Qualitätssicherung hat.
Benutzbarkeit
Benutzbarkeit beinhaltet verschiedene Faktoren darüber, wie einfach der Umgang mit der Software ist. Dies beinhaltet die Erlernbarkeit durch die Zielgruppe der Software, d. h. die Einarbeitungszeit in die Software sollte möglichst gering sein. Weitere, subjektive Kriterien können die intuitive Verwendung z. B. durch wiedererkennbare GUI-Elemente und die attraktive Ausgestaltung der Software sein. Die Benutzbarkeit kann beispielsweise über die Anzahl der notwendigen Interaktionen zur Ausführung einer bestimmten Aktion gemessen werden.
Einsatz
Personen mit verschiedenen Vorkenntnissen oder eine große Anzahl bzw. häufig wechselnde Personen werden die Software verwenden. Sie sollte deshalb intuitiv bedienbar und schnell erlernbar sein.
Maßnahmen
Um die Benutzbarkeit zu gewährleisten, werden üblicherweise Nutzungsstudien durchgeführt. Beachten Sie bitte hierbei, dass das Feedback der Auftraggeber*in alleine nicht ausreicht, um eine qualitative Benutzbarkeit abzuschätzen. In der Regel sollte solch eine Nutzungsstudie fünf oder mehr Teilnehmende haben und früh genug (Januar bis Anfang Februar) stattfinden, damit die Möglichkeit besteht, Feedback aus der Nutzungsstudie in die Software zu integrieren. Im Gegensatz zu anderen, regelmäßig durchgeführten Maßnahmen, sind ein oder zwei Nutzungsstudien im Rahmen des BP ausreichend. Wir empfehlen dringend, zwei Nutzungsstudien durchzuführen, um den Erfolg von Anpassungen nach der ersten Nutzungsstudie zu messen. Man kann aber auch die Benutzbarkeit anhand von regelmäßig berechneten Metriken wie der minimalen Anzahl von Klicks bzw. der minimalen Verschachtelungstiefe zum Durchführen einer Aktion abschätzen. Eine andere Möglichkeit ist es, das Einhalten bestimmter Guidelines zur Benutzerfreundlichkeit festzulegen und dann zu überprüfen, dass diese eingehalten werden.
Bei den Maßnahmen zur Benutzbarkeit ist zu beachten, dass im Rahmen des BPs (und wenn Benutzbarkeit als QS-Ziel gewählt wird) konkrete Unterziele von Benutzbarkeit benannt und sichergestellt werden sollen. Nähere Informationen hierzu sind in der Vorlesung zu QS enthalten.
Effizienz
Effizienz beschreibt die kostenwirksame Nutzung von Ressourcen z. B. bezüglich Speicherverbrauch, Laufzeit oder CPU-Auslastung.
Einsatz
Effizienz kann sich aus den Hardware-Einschränkungen eines Projekts als Ziel ableiten, aber auch aus Anforderungen an die Laufzeit. Es kann z. B. sein, dass Nutzer*innen eine Software nur dann annehmen, falls die Laufzeit eine gewisse Grenze nicht überschreitet.
Maßnahmen
Um die Effizienz der Software zu gewährleisten, sollten Sie am Anfang Kriterien z. B. zur Laufzeit oder zum Speicherverbrauch festlegen. Für bestimmte Projekte ergeben sich solche Einschränkungen auf ganz natürliche Art und Weise (z. B. der Speicherverbrauch darf nicht den verfügbaren Arbeitsspeicher überschreiten). Durch regelmäßige Laufzeitmessungen und Messungen des Speicherverbrauchs (z. B. am Ende von einer Iteration) kann festgestellt werden, ob die Implementierung angepasst werden muss, um die notwendigen Vorgaben zu erfüllen.
Funktionalität
Funktionalität beschreibt den Grad, zu dem die Funktionen der Anwendung die Anforderungen erfüllen. Im Besonderen gewährleistet diese Eigenschaft, dass die Software mit einer bestimmten Genauigkeit die erwarteten Resultate liefert. Funktionen bilden User-Ziele und -Aufgaben angemessen ab d. h. die Benutzer*in kann ihre Aufgaben durchführen, wird aber nicht durch unnötige Funktionen behindert. Dieses Ziel sollte nicht mit _Korrektheit_ verwechselt werden, welches sich auf die Korrektheit gemäß einer gegebenen Spezifikation bezieht. Deshalb sollte im Rahmen der Maßnahmen zur Funktionalität nicht behauptet werden, dass sich die Software nach Umsetzung der Maßnahmen _korrekt_ verhält.
Einsatz
Funktionalität ist eines der wichtigsten QS-Ziele zur Validierung der Funktionsweise der Software und kann in den meisten Projekten verfolgt werden.
Maßnahmen
Die Funktionalität kann mit automatisierten Tests, welche die korrekte Funktionsweise einer Methode oder einer Klasse überprüfen, gewährleistet werden. Weiterhin können auch manuelle Tests von der jeweiligen Entwickler*in durchgeführt werden, um beispielsweise die korrekte Funktionsweise einer graphischen Oberfläche (GUI) zu gewährleisten. Solche automatisierten und manuellen Tests sind in einem regelmäßigen Abstand (z. B. am Ende einer jeden Iteration, vor jedem Merge oder bei jedem Commit) durchzuführen. Sollten Tests fehlschlagen, so ist es wichtig, dass auch die jeweiligen Konsequenzen daraus erkenntlich werden (z. B. Person XY behebt den Fehler in der nachfolgenden Iteration). Bei automatisierten Tests kann eine Testabdeckung berechnet werden als Hinweis dazu, ob ausreichend Tests vorhanden sind. Im Rahmen des BPs empfehlen wir das Nutzen von automatisierenden Tests wann immer es möglich ist. Manuelle Tests sollten wegen des höheren Zeitaufwands für das Testen und der Fehleranfälligkeit nur genutzt werden, wenn Automatisierung nicht möglich oder unverhältnismäßig komplex ist.
Kompatibilität
Kompatibilität beschreibt die Leichtigkeit, mit der einzelne Softwaresysteme oder -komponenten miteinander kombiniert werden können. Dies bedeutet, dass sie Informationen untereinander leicht austauschen können (_Interoperabilität_) und gemeinsame Ressourcen nutzen, ohne sich zu behindern (_Koexistenz_).
Einsatz
Es ist bekannt, dass die Software mit unterschiedlichen Systemen oder Komponenten Informationen austauschen muss oder es wird z. B. Abwärtskompatibilität mit früheren Versionen der Software gewünscht.
Maßnahmen
Es können Code Reviews eingesetzt werden, bei denen der Code auf Einhaltung von Kommunikationsstandards überprüft wird oder auf andere Eigenschaften, die Komponenten für das konkrete Projekt kompatibel machen, wie der geeignete Einsatz von Schnittstellendesigns wie z. B. REST und Standard-Datenformaten wie JSON. Es können auch automatische oder manuelle Tests zum Testen von Kompatibilität mit anderen Systemen durchgeführt werden (häufig als Integrationstests bezeichnet).
Portabilität
Portabilität beschreibt, wie einfach es ist, die Software auf andere Hardware- oder Software-Plattformen zu übertragen (zur Entwicklungszeit), bzw. wie gut sich die Software an unterschiedliche Hardware- und Software-Plattformen anpasst (zur Laufzeit).
Einsatz
Es ist bekannt, dass die Software auf mehreren Plattformen zum Einsatz kommen soll z. B. verschiedenen Betriebssystemen, in verschiedenen Browsern oder auf unterschiedlichen Geräteklassen (Smartphone, Tablet, Desktop).
Maßnahmen
Die Zielsysteme sollten festgelegt und dann sollte überprüft werden, dass die Software auf ihnen ausführbar ist. Es kann auch regelmäßig überprüft werden, ob bzw. wie viele Anteile des Codes plattformabhängig sind und ob automatisierte und manuelle Tests auf allen definierten Plattformen laufen.
Datensicherheit
Datensicherheit beschreibt die Eigenschaft eines Systems, Informationsverluste und unbefugten Datenzugriff zu verhindern.
Einsatz
Die Software führt Operationen aus oder verarbeitet Daten, deren Manipulation oder Zugriff durch Unbefugte kritische Schäden verursachen kann, z. B. Kaufoperationen, Speicherung von persönlichen Daten wie medizinischen Daten etc.
Maßnahmen
In der Regel bieten viele heutige Frameworks im Webdesign einen eingebauten Schutz gegen gängige Angriffe. Lediglich die Verwendung eines solchen Frameworks reicht allerdings nicht aus, um dieses QS-Ziel zu gewährleisten. Daher sollte in regelmäßigen Abständen (z. B. am Ende jeder Iteration) die Sicherheit der Software mit simulierten Angriffen getestet werden. Außerdem existieren statische Analysetools, die Code auf typische Sicherheitslücken wie SQL-Injection, CSRF oder XSS analysieren. Ergebnisse dieser Analysetools müssen dann überprüft und falls nötig der Programmcode überarbeitet werden. Es können auch Code Reviews durchgeführt werden, die spezielle Elemente des _Secure Software Development_ prüfen, wie z. B. das Reinigen von Nutzereingaben.
Hinweis
Im Englischen gibt es die Unterscheidung zwischen _security_ (Datensicherheit) und _safety_ (Sicherheit). Während die Datensicherheit die Unversehrtheit der Daten und deren Schutz gegen externe Angriffe sichert, gewährleistet Sicherheit die Unversehrtheit von Personen (o. Ä.).
Wartbarkeit
Wartbarkeit beschreibt die Effizienz, mit der der erarbeitete Code weiterverwendet und erweitert werden kann. Erweiterbare Software ist einfach auf neue oder sich ändernde Anforderungen anpassbar. Wiederverwendbare Software(-teile) können in andere Anwendungen integriert werden. An dieses Ziel schließen sich Ziele wie Modularität und Testbarkeit an. Modularität beschreibt inwieweit die Software in unabhängige Komponenten aufgeteilt ist, welche ohne Auswirkungen auf andere Code-Teile verändert werden können. Testbarkeit beschreibt die Leichtigkeit, mit der Testkriterien für die Software bestimmt und Tests durchgeführt werden können.
Einsatz
Die Software soll von anderen Programmierern weiterentwickelt werden bzw. Änderungen an der Software oder an bestimmten Teilen sind schon jetzt abzusehen.
Maßnahmen
Zur Sicherstellung der Lesbarkeit können statische Analysetools (Linter) eingesetzt werden, um die Codequalität anhand vorher bestimmter Syntaxregeln zu überprüfen (wie z. B. Länge von Codezeilen, Benennung von Parametern usw.). Für viele Programmiersprachen gibt es Codestil-Standards, die so überprüft werden können und die Lesbarkeit des Codes verbessern sollen. Zu beachten ist hierbei, dass das Verwenden von Lintern allein nicht ausreichend ist, um Lesbarkeit sicherzustellen, weil völlig unverständlicher Code alle Regeln eines Linters erfüllen kann.
Eine weitere nützliche Maßnahme zur Sicherstellung der Wartbarkeit sind deshalb Code Reviews zu regelmäßigen Zeitpunkten (z. B. bei Fertigstellung jedes Features). Hierbei werden vorher festgelegte relevante Code-Eigenschaften (z. B. bezüglich Dokumentation innerhalb des Codes, Implementierungseffizienz von Schleifen, Datenbankanfragen, Einsatz von Design Patterns usw.) anhand einer Liste abgeprüft. So können Code Reviews unterschiedliche Aspekte der Wartbarkeit, wie z. B. Lesbarkeit, Modularität und Testbarkeit, abdecken.
Modularität kann z. B. durch die Berechnung von Kopplungsmetriken überprüft werden. Es kann auch eine Analyse der Abhängigkeiten und Schnittstellen oder der Einhaltung geeigneter Design Patterns bzw. Design Principles im Rahmen von Code Reviews durchgeführt werden.
Bei den Maßnahmen zur Wartbarkeit ist zu beachten, dass im Rahmen des BPs (und wenn Wartbarkeit als QS-Ziel gewählt wird) konkrete Unterziele von Wartbarkeit benannt und sichergestellt werden sollen. Nähere Informationen hierzu sind in der Vorlesung zu QS enthalten.
Zuverlässigkeit
Zuverlässigkeit bezieht sich auf die Wahrscheinlichkeit des ausfallfreien und korrekten Betriebs der Software über einen bestimmten Zeitraum hinweg. Der Begriff umfasst die Verfügbarkeit, die Fehlertoleranz der Software (Robustheit), sowie ihre Wiederherstellbarkeit. Fehlertoleranz bedeutet hier, dass die Software auch unter ungewöhnlichen Betriebssituationen ausführbar ist. Verfügbarkeit heißt, dass die Anwendung zu einem Zeitpunkt bzw. über einen Zeitraum hinweg funktionstüchtig ist.
Einsatz
Es ist besonders wichtig, dass die Anwendung möglichst durchgehend verfügbar ist oder die Software wird in kritischen Systemen eingesetzt.
Maßnahmen
Um die Zuverlässigkeit zu gewährleisten, kann die Software beispielsweise mittels regelmäßigen Lasttests überprüft werden. Weiterhin lassen sich auch automatisierte oder manuelle Tests gegen fehlerhafte Eingaben oder Corner bzw. Edge Cases durchführen, um ungewöhnliche Betriebssituationen zu simulieren. Nur Code Reviews oder Statische Analysen sind hier nicht ausreichend.